package java8;

import java8.pojo.User;

import java.util.Optional;

public class OptionalSample {

    public static void main(String[] args) {
        User user;
        Optional<User> optional;
        // ================================================
        // 创建 Optional 实例的方式
        // ================================================
        // 1. 创建一个空的 Optional, 其 value 值是 null
        optional = Optional.empty();
        // 2. of(value): 当 value 为 null 时, 报 NullPointerException
        optional = Optional.of(new User("Cindy", 18));
        // 3. ofNullable(value), 当 value 为 null 时, 返回一个空的 Optional
        optional = Optional.ofNullable(new User("Cindy", 18));

        // ================================================
        // 获取 value 值的方式
        // ================================================
        // 1. 获取 value 的值
        user = optional.get();
        // 2. 如果 value 的值为 null, 则取 orElse 提供的 value 的值
        user = optional.orElse(new User("Annie", 20));
        // 3. 和 orElse 类似, 只不过 orElseGet 的入参是 Supplier
        user = optional.orElseGet(() -> new User("Annie", 20));

        // ================================================
        // 判断 value 值的方式
        // ================================================
        // 1. 如果 value 不为 null 返回 true
        boolean present = optional.isPresent();
        // 2. 如果 value 不为 null 则执行, 否则什么也不做
        optional.ifPresent(System.out::println);

        // ================================================
        // 映射 value 为其它值的方式
        // ================================================
        // 1. 将 value 为 User 映射成 String
        Optional<String> name1 = optional.map(User::getName);
        // 2. flatMap 和 map 类似, 只不过 map 的入参是 Object, 底层会包装成 Optional<Object>
        //    而 flatMap 的入参直接是 Optional<Object>
        Optional<String> name2 = optional.flatMap(u -> Optional.ofNullable(u.getName()));

        // ================================================
        // 过滤 value 的方式
        // ================================================
        // 1. 如果 value 匹配 filter 条件则返回自身, 否则返回一个空的 Optional
        optional.filter(u -> u.getAge() > 18).ifPresent(System.out::println);
    }

}